/**
 * 对象字面量类型
 */

// 可选属性的检查
function sayHi(person: { name: string; age: number; gender?: number }) {
  person.name;

  person.age;

  // 操作可选属性时需要做检查
  if (person.gender) {
    // 在当前的 if 条件下，这里的 person.gender 的类型已经被收窄了。  【类型收窄】
    const sex: number = person.gender;
  }
}

function printName(obj: { first: string; last?: string }) {
  // console.log(obj.last.toUpperCase()); // Error 对象可能为“未定义”

  if (obj.last) {
    obj.last.toUpperCase();
  }
}

printName({ first: "张" });

// 声明了一个变量，且标注它的类型是一个包含有 name 为 string age 为 number gender 为 number 的对象类型
let person1: {
  name: string;
  age: number;
  gender: number;
};

// 给 变量赋值，赋值内容必须满足上面的标注
//      对象属性个数不能少也不能多，对象属性值也得满足对应的类型描述
person1 = {
  name: "张三",
  age: 18,
  gender: 11,
  // address: "123",
};

// 可选属性
let person2: {
  name: string;
  age: number;
  gender?: number;
};

person2 = {
  name: "张三",
  age: 18,
};

person2.name = "18";

// 只读属性
let person3: {
  readonly name: string;
  age: number;
  gender: number;
};

person3 = {
  name: "张三",
  age: 18,
  gender: 11,
};

person3.name = "里斯";
person3.age++;
